// 一个拥有生命周期 `'a` 的输入引用，其中 `'a` 的存活时间
// 至少与函数的一样长。
fn print_one<'a>(x: &'a i32) {
    println!("print_one: x is {}", x);
}

// 可变引用同样也可能拥有生命周期。
fn add_one(x: &mut i32) {
    println!("x={}", x);
    *x += 1;
}
// 拥有不同生命周期的多个元素。对下面这种情形，两者即使拥有
// 相同的生命周期 `'a` 也没问题，但对一些更复杂的情形，可能
// 就需要不同的生命周期了。
fn print_multi(x: &i32, y: &i32) {
    println!("x is {},y is {}", x, y);
}

// 返回传递进来的引用也是可行的。
// 但必须返回正确的生命周期。
fn pass_x<'a>(x: &'a i32, y: &i32) -> &'a i32 {
    x
}

fn invalid_output() -> (String, i32) {
    let string = (String::from("sad"), 1);
    // 虽然这里语法不报错，在调用时报错
    // string是在函数内声明的，函数结束生命周期就结束了。
    // &string返回了一个引向一个被删除的数据
    // cannot return reference to local variable `STRING`
    // 不能返回一个函数内声明的局部变量！
    string
}

fn main() {
    let mut x = 32;
    add_one(&mut x);
    //
    let (x, y) = (4, 5);
    let x1 = pass_x(&x, &y);
    println!("x= {}", x1);
    //
    let s = invalid_output();
    println!("s={:?}", s);
}
